//package com.huike.clues.service.impl;
//
//import java.io.FileInputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.UUID;
//
//import javax.servlet.ServletOutputStream;
//import javax.servlet.http.HttpServletResponse;
//
//import com.huike.common.utils.uuid.UUIDUtils;
//import io.minio.*;
//import io.minio.errors.MinioException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.web.multipart.MultipartFile;
//
//import com.huike.clues.service.ISysFileService;
//import com.huike.common.config.MinioConfig;
//import com.huike.common.core.domain.AjaxResult;
//
//import lombok.extern.slf4j.Slf4j;
//
//@Service
//@Slf4j
//public class SysFileServiceImpl implements ISysFileService {
//
//    @Autowired
//    MinioConfig minioConfig;
//
//    /**
//     * 文件上传至Minio
//     * 使用try catch finally进行上传
//     * finally里进行资源的回收
//     */
//    @Override
//    public AjaxResult upload(MultipartFile file) {
//        AjaxResult ajax = AjaxResult.success();
//        InputStream inputStream = null;
//        //创建Minio的连接对象
//        MinioClient minioClient = getClient();
//        String bucketName = minioConfig.getBucketName();
//        try {
//            inputStream = file.getInputStream();
//            //基于官网的内容，判断文件存储的桶是否存在 如果桶不存在就创建桶
//            //TODO 补全这部分代码
//            /**
//             * 如果不存在，请制作“亚洲之旅”桶
//             */
//            boolean found =
//                    minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
//            if (!found) {
//                // Make a new bucket called 'asiatrip'.
//                // 如果不存在则创建
//                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
//            } else {
//                System.out.println("Bucket 'bucketName' already exists.");
//            }
//            /**
//             * ================================操作文件================================
//             * 思路：我们上传的文件是:合同.pdf
//             * 那么我们应该上传到配置的bucket内 我们配置的bucketName是huike-crm
//             * 那么我们存在桶里的文件应该是什么样的 也叫“合同.pdf”吗?
//             * 应该按照上传的年月日进行区分
//             * 举例：2021-05-05日进行上传的
//             * 那么存在桶里的路径应该是
//             * huike-crm/2021/05/05/这个目录下
//             * 而对于同一个文件，存在重名问题，所以我们应该利用UUID生成一个新的文件名，并拼接上 .pdf 作为文件后缀
//             * 那么完整的路径就是 huike-crm/2021/05/05/uuid.pdf
//             *
//             * 如果上述思路你无法理解，那么就直接存放在桶内生成uuid+.pdf即可
//             * 即：huike-crm/uuid.pdf
//             */
//            //TODO 基于上述逻辑补全代码
//            /**
//             * 上传“/首页/用户/照片/亚洲照片.zip”作为对象名称“亚洲照片-2015.zip”到桶
//             */
//            // 'asiatrip'.
//            minioClient.putObject(
//                    PutObjectArgs.builder()
//                            .bucket(bucketName)
//                            .object(getName(file))
//                            .stream(inputStream, inputStream.available(), -1)
//                            .build());
//
//            System.out.println(
//                    "'/home/user/Photos/asiaphotos.zip' is successfully uploaded as "
//                            + "object 'asiaphotos-2015.zip' to bucket 'asiatrip'.");
//        } catch (MinioException e) {
//            System.out.println("Error occurred: " + e);
//            System.out.println("HTTP trace: " + e.httpTrace());
//
//            /**                http://localhost:9000/huike-crm/2022/06/03/5d2ad4d31b34429db59d320723498e54.pdf
//             * 构建返回结果集http://192.168.15.53:9000/huike-crm/2022-10-16/179050f1-b3ca-4983-9dd1-91ba540b8299.pdf
//             */
//
//
//            String url = "http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + bucketName + "/" + getName(file);
//
//            ajax.put("fileName", "/" + bucketName + "/" + getName(file));
//            ajax.put("url", url);
//
//            /**
//             * 封装需要的数据进行返回
//             */
//            return AjaxResult.success(ajax);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return AjaxResult.error("上传失败");
//        } finally {
//            //防止内存泄漏
//            if (inputStream != null) {
//                try {
//                    inputStream.close(); // 关闭流
//                } catch (IOException e) {
//                    log.debug("inputStream close IOException:" + e.getMessage());
//                }
//            }
//        }
//        return AjaxResult.success(ajax);
//    }
//
//    /**
//     * 拼接 文件名称
//     *
//     * @param file
//     * @return
//     */
//
//    private String getName(MultipartFile file) {
//        //获取当前日期
//        Date date = new Date();
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/");
//
//        //转化日期类型
//        String format = simpleDateFormat.format(date);
//
//        //获取原文件名称
//        String originalFilename = file.getOriginalFilename();
//
//        //设置新的文件名称  根据日期 + UUID + 原始文件 .后面的
//        String name = format.toString() + UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//        return name;
//    }
//
//
//    /**
//     * 免费提供一个获取Minio连接的方法
//     * 获取Minio连接
//     *
//     * @return
//     */
//    private MinioClient getClient() {
//        MinioClient minioClient =
//                MinioClient.builder()
//                        .endpoint("http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort())
//                        .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
//                        .build();
//        return minioClient;
//    }
//}
